<?php
/**
 * Page d'index de l'administration
 * Donne accès à chaque pages liées à l'administration
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class joursdesactivesAction extends shAction {
	/**
	 * Fonction appellée automatiquement pour toutes les requêtes de l'action
	 */
	public function init() {
		$this->setTitle('Gestion des jours désactivés');
		$this->addAriane(shRequest::link('administration'), 'Administration');
	}


	/**
	 * Execute la méthode par défaut pour l'action index
	 */
	public function execute() {
		$jours_desactives = shSGBD::select('SELECT jours_desactives.id, jours_desactives.date_debut, '.
			   'jours_desactives.date_fin '.
			   'FROM jours_desactives '.
			   'WHERE jours_desactives.date_fin>:jour ',
			   array(':jour'=>Date::today()->toSGBD())
		);
		$this->assign('jours_desactives', $jours_desactives);
	}

	/**
	 * Execute la méthode par défaut pour l'action index
	 */
	public function executeCreate() {
		// Création du formulaire
		$formulaire = new shFormulaire();
		$formulaire->setSubmitText('Ajouter la période désactivée');

		// Ajout d'un champ date pour la date de début
		shField::date('Date de début')
			   ->appendTo($formulaire);

		// Ajout d'un champ date pour la date de fin
		shField::date('Date de fin')
			   ->appendTo($formulaire);

		// Sélection des promotions dont l'user est responsable
		$promotions = shSGBD::select(
			   'SELECT DISTINCT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
			   'FROM promotion '.
			   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
			   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
			   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
			   'WHERE promotion.date_fin>:date '.
			   'ORDER BY filiere.intitule, specialite.intitule ',
			   array(':date'=>Date::today()->toSGBD())
		);

		if($promotions) {
			// Ajout d'une multibox pour les promotions
			$multibox_promotions = shField::multibox('Promotion(s)')
				   ->setRequired(false)
				   ->appendTo($formulaire);

			// Ajout des promotions dans la multibox
			foreach($promotions AS $promotion) {
				$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
				$multibox_promotions->addOption($promotion->id, $promotion->specialite.' '.$promotion->filiere.' '.$annee);
			}


		}

		// Submit du formulaire
		$formulaire->setCheck(function($formulaire) {
		   if ( !$formulaire->isError() ) {
			   // Vérification des dates
			   if(Date::fromFormulaire($formulaire->getField('Date de début')->getValue()) >
					 Date::fromFormulaire($formulaire->getField('Date de fin')->getValue()) ) {
				   $formulaire->getField('Date de début')->setError('La date de début doit être inférieure à la date de fin');
			   }
		   }
		});

		// Submit du formulaire
		$formulaire->setSubmit(function($formulaire) {
				   // Enregistrement de la période : Table jours_desactives
				   $id_jours_desactives = shSGBD::insert(
						 'INSERT INTO jours_desactives '.
						 '(date_debut, date_fin) '.
						 'VALUES (:date_debut, :date_fin) ',
						 array(':date_debut'=>Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
						 ':date_fin'=>Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD()
				   ));

				   // Enregistrement du lien période-promotion : table jours_desactives_promotion
				   if($formulaire->isField('Promotion(s)')) {
					   $ids_promotion = $formulaire->getField('Promotion(s)')->getValue();

					   foreach($ids_promotion AS $id_promotion) {
						   shSGBD::insert(
								 'INSERT INTO jours_desactives_promotion '.
								 '(id_promotion, id_jours_desactives) '.
								 'VALUES (:id_promotion, :id_jours_desactives) ',
								 array(':id_promotion'=>$id_promotion,
								 ':id_jours_desactives'=>$id_jours_desactives
						   ));
					   }

				   }


				   // Redirection
				   shAction::redirect(shRequest::__instance()->getModule(),
						 shRequest::__instance()->getAction(),
						 null, null);
			   })
		;

		// Assignement du formulaire
		$this->assign('formulaire', $formulaire);

	}


	/**
	 * Execute la méthode par défaut pour l'action index
	 * @param <integer> id jours desactives à modifier
	 */
	public function executeEdit($_id_jours_desactives = null) {
		// Création du formulaire
		$formulaire = new shFormulaire();
		$formulaire->setSubmitText('Modifier la période désactivée');

		if($_id_jours_desactives != null) {
			// Sélection de la période
			$jours_desactives = shSGBD::selectOne(
				   'SELECT jours_desactives.id, jours_desactives.date_debut, jours_desactives.date_fin '.
				   'FROM jours_desactives '.
				   'WHERE jours_desactives.id=:id_jours_desactives ',
				   array(':id_jours_desactives'=>$_id_jours_desactives)
			);

			if(!$jours_desactives)
				throw new Exception('Numéro d\'identifiant de période non trouvée ', 404);

			// Ajout d'un champ date pour la date de début
			shField::date('Date de début')
				   ->setValue(Date::fromSGBD($jours_desactives->date_debut)->toFormulaire())
				   ->appendTo($formulaire);

			// Ajout d'un champ date pour la date de fin
			shField::date('Date de fin')
				   ->setValue(Date::fromSGBD($jours_desactives->date_fin)->toFormulaire())
				   ->appendTo($formulaire);

			// Sélection des promotions dont l'user est responsable
			$promotions = shSGBD::select(
				   'SELECT DISTINCT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
				   'FROM promotion '.
				   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
				   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
				   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
				   'WHERE promotion.date_fin>:date '.
				   'ORDER BY filiere.intitule, specialite.intitule ',
				   array(':date'=>Date::today()->toSGBD())
			);


			if($promotions) {
				// Ajout d'une multibox pour les promotions
				$multibox_promotions = shField::multibox('Promotion(s)')
					   ->setRequired(false)
					   ->appendTo($formulaire);

				// Ajout des promotions dans la multibox
				foreach($promotions AS $promotion) {
					$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
					$multibox_promotions->addOption($promotion->id, $promotion->specialite.' '.$promotion->filiere.' '.$annee);
				}

				// Sélection des promotions liées
				$jours_desactives_promotions = shSGBD::select(
					   'SELECT jours_desactives_promotion.id_promotion '.
					   'FROM jours_desactives_promotion '.
					   'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives ',
					   array(':id_jours_desactives'=>$_id_jours_desactives)
				);

				$promotions_selectionnees = array();
				foreach($jours_desactives_promotions AS $jours_desactives_promotion)
					$promotions_selectionnees[] = $jours_desactives_promotion->id_promotion;

				// Sélection des promotions dans la multibox
				$multibox_promotions->setValue($promotions_selectionnees);


			}

			// Submit du formulaire
			$formulaire->setCheck(function($formulaire) {
					  if ( !$formulaire->isError() ) {  // Vérification des dates
					   if(Date::fromFormulaire($formulaire->getField('Date de début')->getValue()) >
							 Date::fromFormulaire($formulaire->getField('Date de fin')->getValue()) ) {
						   $formulaire->getField('Date de début')->setError('La date de début doit être inférieure à la date de fin');
					   }
					  }
				   });
		} // Fin if parametre id_jours_desactives
		else {
			throw new Exception('Numéro d\'identifiant de période non trouvée ', 404);
		}

		// Submit du formulaire
		$formulaire->setSubmit(function($formulaire) use($_id_jours_desactives) {
				   // MAJ de la période : Table jours_desactives
				   shSGBD::update(
						 'UPDATE jours_desactives '.
						 'SET date_debut=:date_debut, '.
						 'date_fin=:date_fin '.
						 'WHERE jours_desactives.id=:id_jours_desactives ',
						 array(':id_jours_desactives'=>$_id_jours_desactives,
						 ':date_debut'=>Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
						 ':date_fin'=>Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD())
				   );

				   // Enregistrement du lien période-promotion : table jours_desactives_promotion
				   if($formulaire->isField('Promotion(s)')) {
					   // Suppression de tous les enregistrements des promotions
					   shSGBD::delete(
							 'DELETE FROM jours_desactives_promotion '.
							 'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives ',
							 array(':id_jours_desactives'=>$_id_jours_desactives)
					   );

					   // Récupération des valeurs des nouvelles promotions
					   $ids_promotion = $formulaire->getField('Promotion(s)')->getValue();

					   // Pour chaque promotion on insère un nouvel enregistrement
					   foreach($ids_promotion AS $id_promotion) {
						   shSGBD::insert(
								 'INSERT INTO jours_desactives_promotion '.
								 '(id_promotion, id_jours_desactives) '.
								 'VALUES (:id_promotion, :id_jours_desactives) ',
								 array(':id_promotion'=>$id_promotion,
								 ':id_jours_desactives'=>$_id_jours_desactives
						   ));
					   }

				   }


				   // Redirection
				   shAction::redirect(shRequest::__instance()->getModule(),
						 shRequest::__instance()->getAction(),
						 null, null);
			   })
		;

		// Assignement du formulaire
		$this->assign('formulaire', $formulaire);

	}


	/**
	 * Execute la méthode par défaut pour l'action index
	 */
	public function executeDelete($_id_jours_desactives = null) {

		if($_id_jours_desactives == null)
			throw new Exception('Paramètre numéro de période de jours désactivés non trouvé', 404);

		// MAJ de la période : Table jours_desactives
		shSGBD::delete(
			   'DELETE FROM jours_desactives '.
			   'WHERE jours_desactives.id=:id_jours_desactives ',
			   array(':id_jours_desactives'=>$_id_jours_desactives)
		);

		// Suppression de tous les enregistrements des promotions
		shSGBD::delete(
			   'DELETE FROM jours_desactives_promotion '.
			   'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives ',
			   array(':id_jours_desactives'=>$_id_jours_desactives)
		);

		// Redirection
		shAction::redirect(shRequest::__instance()->getModule(),
			   shRequest::__instance()->getAction(),
			   null, null);
	}

}
?>
